home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cpp_libs / answrbok / 8_6.lha / 8_6 / out.c < prev    next >
C/C++ Source or Header  |  1993-08-08  |  5KB  |  292 lines

  1. * Copyright (c) 1990 by AT&T Bell Telephone Laboratories, Incorporated. */
  2. * The C++ Answer Book */
  3. * Tony Hansen */
  4. * All rights reserved. */
  5. *ident    "@(#)cfront:lib/stream/out.c    1.6" */
  6. *
  7. C++ stream i/o source
  8.  
  9. out.c
  10. /
  11.  
  12. include <string.h>
  13. include <stream.h>
  14.  
  15.  
  16. define MAXOSTREAMS 20
  17.  
  18. onst    cb_size = 1024;
  19. onst    fld_size = 256;
  20.  
  21. * a circular formating buffer */
  22. tatic char    formbuf[cb_size];    // some slob for form overflow
  23. tatic char*    bfree=formbuf;
  24. tatic char*    max = &formbuf[cb_size-1];
  25.  
  26. har* chr(register i, register int w)    /* note: chr(0) is "" */
  27.  
  28. register char* buf = bfree;
  29.  
  30. if (w<=0 || fld_size<w) w = 1;
  31. w++;                /* space for trailing 0 */
  32. if (max < buf+w) buf = formbuf;
  33. bfree = buf+w;
  34. char * res = buf;
  35.  
  36. w -= 2;                /* pad */
  37. while (w--) *buf++ = ' ';
  38. if (i<0 || 127<i) i = ' ';
  39. *buf++ = i;
  40. *buf = 0;
  41. return res;
  42.  
  43.  
  44. har* str(const char* s, register int w)
  45.  
  46. register char* buf = bfree;
  47. int ll = strlen(s);
  48. if (w<=0 || fld_size<w) w = ll;
  49. if (w < ll) ll = w;
  50. w++;                /* space for traling 0 */
  51. if (max < buf+w) buf = formbuf;
  52. bfree = buf+w;
  53. char* res = buf;
  54.  
  55. w -= (ll+1);            /* pad */
  56. while (w--) *buf++ = ' ';
  57. while (*s) *buf++ = *s++;
  58. *buf = 0;
  59. return res;
  60.  
  61.  
  62. har* form(const char* format ...)
  63.  
  64. register* ap = (int*)((char*)&format+sizeof(char*));    // not completely general
  65. register char* buf = bfree;
  66. if (max < buf+fld_size) buf = formbuf;
  67.  
  68. register ll = sprintf(buf,format,ap[0],ap[1],ap[2],ap[3],ap[4],ap[5],ap[6],ap[7],ap[8],ap[9]);    // too few words copied
  69. if (0<ll && ll<cb_size)                // length
  70.     ;
  71. else if (buf<(char*)ll && (char*)ll<buf+cb_size)// pointer to trailing 0
  72.     ll = (char*)ll - buf;
  73. else
  74.     ll = strlen(buf);
  75. if (fld_size < ll) exit(10);
  76. bfree = buf+ll+1;
  77. return buf;
  78.  
  79.  
  80. onst char a10 = 'a'-10;
  81.  
  82. har* hex(long ii, register w)
  83.  
  84. int m = sizeof(long)*2;        // maximum hex digits for a long
  85. if (w<0 || fld_size<w) w = 0;
  86. int sz = (w?w:m)+1;
  87. register char* buf = bfree;
  88. if (max < buf+sz) buf = formbuf;
  89. register char* p = buf+sz;
  90. bfree = p+1;
  91. *p-- = 0;            // trailing 0
  92. register unsigned long i = ii;
  93.  
  94. if (w) {
  95.     do {
  96.         register h = (int)(i&0xf);
  97.         *p-- = (h < 10) ? h+'0' : h+a10;
  98.     } while (--w && (i>>=4));
  99.     while (0<w--) *p-- = ' ';
  100. }
  101. else {
  102.     do {
  103.         register h = int(i&0xf);
  104.         *p-- = (h < 10) ? h+'0' : h+a10;
  105.     } while (i>>=4);
  106. }
  107. return p+1;
  108.  
  109.  
  110. har* oct(long ii, int w)
  111.  
  112. int m = sizeof(long)*3;        // maximum oct digits for a long
  113. if (w<0 || fld_size<w) w = 0;
  114. int sz = (w?w:m)+1;
  115. register char* buf = bfree;
  116. if (max < buf+sz) buf = formbuf;
  117. register char* p = buf+sz;
  118. bfree = p+1;
  119. *p-- = 0;            // trailing 0
  120. register unsigned long i = ii;
  121.  
  122. if (w) {
  123.     do {
  124.         register h = int(i&07);
  125.         *p-- = h + '0';
  126.     } while (--w && (i>>=3));
  127.     while (0<w--) *p-- = ' ';
  128. }
  129. else {
  130.     do {
  131.         register h = int(i&07);
  132.         *p-- = h+'0';
  133.     } while (i>>=3);
  134. }
  135.  
  136. return p+1;
  137.  
  138.  
  139. har* dec(long i, int w)
  140.  
  141. int sign = 0;
  142. if (i < 0) {
  143.     sign = 1;
  144.     i = -i;
  145. }
  146. int m = sizeof(long)*3;        /* maximum dec digits for a long */
  147. if (w<0 || fld_size<w) w = 0;
  148. int sz = (w?w:m)+1;
  149. register char* buf = bfree;
  150. if (max < buf+sz) buf = formbuf;
  151. register char* p = buf+sz;
  152. bfree = p+1;
  153. *p-- = 0;            /* trailing 0 */
  154.  
  155. if (w) {
  156.     do {
  157.         register h = int(i%10);
  158.         *p-- = h + '0';
  159.     } while (--w && (i/=10));
  160.     if (sign && 0<w) {
  161.         w--;
  162.         *p-- = '-';
  163.     }
  164.     while (0<w--) *p-- = ' ';
  165. }
  166. else {
  167.     do {
  168.         register h = int(i%10);
  169.         *p-- = h + '0';
  170.     } while (i/=10);
  171.     if (sign) *p-- = '-';
  172. }
  173.  
  174. return p+1;
  175.  
  176.  
  177. stream& ostream::operator<<(const char* s)
  178.  
  179. register streambuf* nbp = bp;
  180.  
  181. if (state || s==0 || *s==0) return *this;
  182.  
  183. do
  184.     if (nbp->sputc(*s++) == EOF) {
  185.         state |= _eof|_fail;
  186.         break;
  187.     }
  188. while (*s);
  189.  
  190. return *this;
  191.  
  192.  
  193. stream& ostream::operator<<(unsigned long i)
  194.  
  195. register streambuf* nbp = bp;
  196. char buf[32];
  197. register char *p = buf;
  198.  
  199. if (state) return *this;
  200.  
  201. do {
  202.     *p++ = '0' + int(i%10);
  203.     i = i/10;
  204. } while (i > 0);
  205.  
  206. do {
  207.     if (nbp->sputc(*--p) == EOF) {
  208.         state |= _fail | _eof;
  209.         break;
  210.     }
  211. } while (p != buf);
  212.  
  213. return *this;
  214.  
  215.  
  216. stream& ostream::operator<<(long i)
  217.  
  218. register streambuf* nbp = bp;
  219. register long j;
  220. char buf[32];
  221. register char *p = buf;
  222.  
  223. if (state) return *this;
  224.  
  225. if (i < 0) {
  226.     nbp->sputc('-');
  227.     j = -i;
  228. } else
  229.     j = i;
  230.  
  231. do {
  232.     *p++ = '0' + char(j%10);
  233.     j = j/10;
  234. } while (j > 0);
  235.  
  236. do {
  237.     if (nbp->sputc(*--p) == EOF) {
  238.         state |= _fail | _eof;
  239.         break;
  240.     }
  241. } while (p != buf);
  242.  
  243. return *this;
  244.  
  245.  
  246. stream& ostream::put(char c)
  247.  
  248. if (state) return *this;
  249.  
  250. if (bp->sputc(c) == EOF) state |= _eof|_fail;
  251.  
  252. return *this;
  253.  
  254.  
  255. stream& ostream::operator<<(double d)
  256.  
  257. register streambuf* nbp = bp;
  258. char buf[32];
  259. register char *p = buf;
  260.  
  261. if (state) return *this;
  262.  
  263. sprintf(buf,"%g",d);
  264. while (*p != '\0')
  265.     if (nbp->sputc(*p++) == EOF) {
  266.         state |= _eof|_fail;
  267.         break;
  268.     }
  269. return *this;
  270.  
  271.  
  272. stream& ostream::operator<<(const streambuf& b)
  273.  
  274. register streambuf* nbp = bp;
  275. register int c;
  276.  
  277. if (state) return *this;
  278.  
  279. c = b.sgetc();
  280. while (c != EOF) {
  281.     if (nbp->sputc(c) == EOF) {
  282.         state |= _eof|_fail;
  283.         break;
  284.     }
  285.     c = b.snextc();
  286. }
  287.  
  288. return *this;
  289.  
  290.  
  291.  
  292.